package Sstring;

/**
 * string
 * 常量池特点:java推荐我们用字面量形式创建字符串对象,这样相同字面量的字符串对象会被重用减少开销
 */
public class StringDemo {
    public static void main(String[] args) {
        String s1="123abc";
        String s2="123abc";//相同字面量会重用对象,因此s2直接重用了s1对象
        System.out.println("s1:"+s1);
        System.out.println("s2:"+s2);
        System.out.println(s1==s2);//true s1与s2的地址相同

        String s3="123abc";
        System.out.println("s3:"+s3);
        System.out.println(s1==s3);//true

        String s4=new String("123abc");//nsw一定产生新对象,新建对象地址就会发生改变,不推荐的操作
        System.out.println("s4:"+s4);
        System.out.println(s4==s1);//false

        s1=s1+"!";//字符串是不变对象,修改内容会创建新对象
        System.out.println("s1:"+s1);//s1不在指向原有的对象
        System.out.println("s2:"+s2);//s2,s3都没有影响
        System.out.println(s1==s2);//false s1的地址已经与s2的不同了


         /*
            触发了编译器的预编译特性
            当编译器编译代码时,若发现一个计算表达式计算符两侧都是直接量时,会直接计算结果并将结果替换
            该计算表达式并编译到class文件(字节码文件)中.

            下面代码在.class文件中的样子是:
            String s5 = "123abc";
         */
        String s5="123"+"abc";
        System.out.println(s5);
        System.out.println(s2==s5);//true

        String s="123";
        String s6=s+"abc";//拼接内容会产生新对象
        System.out.println("s6:"+s6);
        System.out.println(s6==s2);//flase

    }
}
